package com.han.hotelplat.comm.utils.dbutils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.sql.CommonDataSource;

/**
 * string工具
 * @author chao
 *
 */
public class StringUtils {
	/**
	 * 连接数组 
	 * 不支持基础类型数组例如：int[]
	 * @see #joinByInts(String, int...)
	 * @param separator 分隔符
	 * @param objects
	 */
	public static String join(String separator, Object...objects){
		if(objects.length==0){
			return "";
		}
		StringBuilder sb = new StringBuilder(objects[0].toString());
		for (int i = 1; i < objects.length; i++) {
			sb.append(separator).append(objects[i]);
		}
		return sb.toString();
	}
	
	/**
	 * 连接数组
	 * @param separator 分隔符
	 * @param ints
	 */
	public static String joinByInts(String separator, int...ints){
		if(ints.length==0){
			return "";
		}
		StringBuilder sb = new StringBuilder(ints[0]+"");
		for (int i = 1; i < ints.length; i++) {
			sb.append(separator).append(ints[i]);
		}
		return sb.toString();
	}

	/**
	 * 连接数组
	 * @param separator 分隔符
	 * @param ls
	 */
	public static String join(String separator, List ls){
		if(ls == null || ls.isEmpty()){
			return "";
		}
		StringBuilder sb = new StringBuilder(ls.get(0).toString());
		for (int i = 1; i < ls.size(); i++) {
			sb.append(separator).append(ls.get(i));
		}
		return sb.toString();
	}
	
	/** 
	 * 转义正则特殊字符 （$()*+.[]?\^{},|） 
	 *  
	 * @param keyword 
	 * @return 
	 */  
	public static String escapeExprSpecialWord(String keyword) {  
	    if (StringUtils.isNotBlank(keyword)) {  
	        String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };  
	        for (String key : fbsArr) {  
	            if (keyword.contains(key)) {  
	                keyword = keyword.replace(key, "\\" + key);  
	            }  
	        }  
	    }  
	    return keyword;  
	}  
	
	/**
	 * 字符串拆分成Map
	 *
	 * @param separator：分隔符 会进行转义正则特殊字符 （$()*+.[]?\^{},|） 
	 * @param data:拼接字符串 例如A_B_C
	 * @return Map<Integer, T> key计算从1开始
	 * @input StringUtils.split("_", "A_B_C") 
	 * @output Map{1=A, 2=B, 3=C}
	 */
	@SuppressWarnings("unchecked")
	public static Map<Integer, String> splitToMap(String separator, String data){
		Map<Integer, String> maps = new HashMap<>();
		String[] datas = split(separator, data);
		if(datas.length == 0){
			return new HashMap<>();
		}
		int i = 1;//从1开始
		for(String str: datas){
			maps.put(i, str);
			i++;
		}
		return maps;
	}
	
	/**
	 * 字符串拆分
	 * @param separator:分隔符 会进行转义正则特殊字符 （$()*+.[]?\^{},|） 
	 * @param data
	 * @return
	 */
	public static String[] split(String separator, String data){
		if(isBlank(data) || isEmpty(separator)){
			return new String[0];
		}
		
		//避免特殊字符进行转义
		separator = escapeExprSpecialWord(separator);
		String[] datas = data.split(separator);
		return datas;
	}

	/**
	 * 字符串拆分
	 * @param separator:分隔符 会进行转义正则特殊字符 （$()*+.[]?\^{},|） 
	 * @param data
	 * @return
	 */
	public static int[] splitToInteger(String separator, String data){
		String[] datas = split(separator, data);
		if(datas == null || datas.length == 0){
			return null;
		}
		int[] res = new int[datas.length];
		for(int i = 0; i < datas.length; i++){
			double value = Double.valueOf(datas[i]);
			res[i] = (int) value;
		}
		
		return res;
	}
	
	/**
	 * 字符串拆分
	 * @param separator:分隔符 会进行转义正则特殊字符 （$()*+.[]?\^{},|） 
	 * @param data
	 * @return
	 */
	public static int[] splitToIntegerNoNull(String separator, String data){
		int[] arr = splitToInteger(separator, data);
		if(arr==null){
			return new int[0];
		}else{
			return arr;
		}
	}
	
	/**
	 * 字符串拆分
	 * @param separator:分隔符 会进行转义正则特殊字符 （$()*+.[]?\^{},|） 
	 * @param data
	 * @return
	 */
	public static List<Integer> splitToListInteger(String separator, String data){
		String[] datas = split(separator, data);
		if(datas == null || datas.length == 0){
			return new ArrayList<Integer>();
		}
		List<Integer> res = new ArrayList<Integer>();
		for(int i = 0; i < datas.length; i++){
			double value = Double.valueOf(datas[i]);
			res.add((int) value);
		}
		return res;
	}
	
	/**
	 * 字符串拆分
	 * @param separator:分隔符 会进行转义正则特殊字符 （$()*+.[]?\^{},|） 
	 * @param data
	 * @return
	 */
	public static List<int[]> splitToArrList(String separator1, String separator2, String data){
		String[] datas = split(separator2, data);
		if(datas == null || datas.length == 0){
			return new ArrayList<>();
		}
		List<int[]> res = new ArrayList<>();
		for(int i = 0; i < datas.length; i++){
			int[] split = splitToInteger(separator1, datas[i]);
			res.add(split);
		}
		return res;
	}
	
	/**
	 * 字符串分割成Map
	 * <pre>
	 * 	StringUtils.splitToMap("_","|","a_A|b_B") = Map{a=A, b=B}
	 * </pre>
	 * @param separator  key,value的分割
	 * @param separator1 Map,Map的分割
	 * @param data
	 * @return
	 */
	public static Map<Integer, Integer> splitToIntegerMap(String separator, String separator1, String data) {
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		
		String[] dataArr = StringUtils.split(separator1, data);
		
		for (String mapStr : dataArr) {
			String[] strs = StringUtils.split(separator, mapStr);
			if(strs.length != 2) { //格式不符合的跳过
				continue;
			}
			if(map.containsKey(Integer.parseInt(strs[0]))) {
				continue;
			}
			map.put(Integer.parseInt(strs[0]), Integer.parseInt(strs[1]));
		}
		
		return map;
	}
	
	/**
	 * Map合并成String
	 * <pre>
	 * 	StringUtils.combineToString("_","|", Map{a=A, b=B}) = "a_A|b_B"
	 * </pre>
	 * @param separator  key,value的分割
	 * @param separator1 Map,Map的分割
	 * @param data
	 * @return
	 */
	public static <T, S> String combineToString(String separator, String separator1, Map<T, S> data) {
		if(data == null || data.isEmpty()) {
			return "";
		}
		
		StringBuilder builder = new StringBuilder();
		for (Map.Entry<T, S> entry : data.entrySet()) {
			builder.append(entry.getKey()).append(separator).append(entry.getValue()).append(separator1);
		}
		int length = builder.length();
		builder.setLength(length > 0 ? length - 1 : 0);
		return builder.toString();
	}
	
	/**
	 * 大写首字母
	 */
	public static String upFirst(String str) {
		return str.substring(0, 1).toUpperCase().concat(str.substring(1));
	}
	
	/**
	 * 小写首字母
	 */
	public static String lowerFirst(String str) {
		return str.substring(0, 1).toLowerCase().concat(str.substring(1));
	}
	
	/**
	 * 首字母大写
	 * @author Craig
	 * @param str 
	 */
	public static String upFirst1(String str) {
		char[] strs = str.toCharArray();
		if((strs[0] >= 'a' && strs[0] <= 'z')) {
			strs[0] -= 32;
			return String.valueOf(strs);
		}else {
			return upFirst(str);
		}
	}

	/**
	 * 下划线风格转小写驼峰
	 */
	public static String underlineToLowerCamal(String s){
		String[] ss = s.split("_");
		for (int i = 1; i < ss.length; i++) {
			ss[i] = upFirst1(ss[i]);
		}
		return join("", ss);
	}

	/**
	 * 下划线风格转大写驼峰
	 */
	public static String underlineToUpperCamal(String s){
		String[] ss = s.split("_");
		for (int i = 0; i < ss.length; i++) {
			ss[i] = upFirst1(ss[i]);
		}
		return join("", ss);
	}

	/**
	 * 驼峰转下划线,未处理大小写
	 */
	public static String camalToUnderline(String s){
		StringBuilder sb = new StringBuilder();
		if(s.length()>0){
			sb.append(s.charAt(0));
		}
		for (int i = 1; i < s.length(); i++) {
			char c = s.charAt(i);
			if(Character.isUpperCase(c)){
				sb.append("_");
			}
			sb.append(c);
		}
		return sb.toString();
	}
	
	/**
	 * 判断字符串为空（null或者""）
	 * <pre>
	 * StringUtils.isEmpty(null) = true
	 * StringUtils.isEmpty("") = true
	 * StringUtils.isEmpty(" ") = false
	 * StringUtils.isEmpty("bob") = false
	 * StringUtils.isEmpty("  bob  ") = false
	 * </pre>
	 * @param s
	 * @return
	 */
	public static boolean isEmpty(String s) {
		 return s == null || s.length() == 0;
	}
	
	/**
	 * 判断字符串不为空（null或者""）
	 * <pre>
	 * StringUtils.isNotEmpty(null) = false
	 * StringUtils.isNotEmpty("") = false
	 * StringUtils.isNotEmpty(" ") = true
	 * StringUtils.isNotEmpty("bob") = true
	 * StringUtils.isNotEmpty("  bob  ") = true
	 * </pre>
	 * @param s
	 * @return
	 */
	public static boolean isNotEmpty(String s) {
		return !StringUtils.isEmpty(s);
	}
	
	/**
	 * 判断字符串为空白字符串(null或者""或者" ")
	 * <pre>
	 * StringUtils.isBlank(null) = true
	 * StringUtils.isBlank("") = true
	 * StringUtils.isBlank(" ") = true
	 * StringUtils.isBlank("bob") = false
	 * StringUtils.isBlank(" bob ") = false
	 * </pre>
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		int strLen;
		if(s == null || (strLen = s.length()) == 0 ) {
			return true;
		}
		
		for (int i = 0; i < strLen; i++) {
			if(Character.isWhitespace(s.charAt(i)) == false) {
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 判断字符串不为空白字符串(null或者""或者" ")
	 * <pre>
	 * StringUtils.isNotBlank(null) = false
	 * StringUtils.isNotBlank("") = false
	 * StringUtils.isNotBlank(" ") = false
	 * StringUtils.isNotBlank("bob") = true
	 * StringUtils.isNotBlank(" bob ") = true
	 * </pre>
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !StringUtils.isBlank(s);
	}
	
	/**
	 * 截取字符串
	 * <pre>
	 * StringUtils.substringBefore("ajp_djp_gjp_j", "")  = ""
	 * StringUtils.substringBefore("ajp_djp_gjp_j", null)  = ""
	 * StringUtils.substringBefore("ajp_djp_gjp_j", "jp_")  = "a"
	 * StringUtils.substringBefore("ajp_djp_gjp_j", "jk_")  = "ajp_djp_gjp_j"
	 * </pre>
	 * @param str  被截取的字符串
	 * @param separator  截取分隔符
	 * @return
	 */
    public static String substringBefore(String str, String separator) {
      if ((isEmpty(str)) || (separator == null)) {
    	  return str;
      }
      if (separator.isEmpty()) {
    	  return "";
      }
      int pos = str.indexOf(separator);
      if (pos == -1) {
    	  return str;
      }
      return str.substring(0, pos);
    }
    
    /**
	 * 截取字符串
	 * <pre>
	 * StringUtils.substringAfter("ajp_djp_gjp_j", "jp_")  = "defjp_ghi"
	 * StringUtils.substringAfter("ajp_djp_gjp_j", "")  = "ajp_djp_gjp_j"
	 * StringUtils.substringAfter("ajp_djp_gjp_j", null)  = "ajp_djp_gjp_j"
	 * StringUtils.substringAfter("ajp_djp_gjp_j", "jk_")  = ""
	 * </pre>
	 * @param str  被截取的字符串
	 * @param separator  截取分隔符
	 * @return
	 */
    public static String substringAfter(String str, String separator) {
      if (isEmpty(str)) {
        return str;
      }
      if (separator == null) {
        return "";
      }
      int pos = str.indexOf(separator);
      if (pos == -1) {
        return "";
      }
      return str.substring(pos + separator.length());
    }

    /**
   	 * 截取字符串
   	 * <pre>
   	 * StringUtils.substringBeforeLast("ajp_djp_gjp_j", "")  = "ajp_djp_gjp_j"
   	 * StringUtils.substringBeforeLast("ajp_djp_gjp_j", null)  = "ajp_djp_gjp_j"
   	 * StringUtils.substringBeforeLast("ajp_djp_gjp_j", "jk_")  = "ajp_djp_g"
   	 * StringUtils.substringBeforeLast("ajp_djp_gjp_j", "jp_")  = "ajp_djp_g"
   	 * </pre>
   	 * @param str  被截取的字符串
   	 * @param separator  截取分隔符
   	 * @return
   	 */
    public static String substringBeforeLast(String str, String separator) {
      if ((isEmpty(str)) || (isEmpty(separator))) {
        return str;
      }
      int pos = str.lastIndexOf(separator);
      if (pos == -1) {
        return str;
      }
      return str.substring(0, pos);
    }

    /**
   	 * 截取字符串
   	 * <pre>
   	 * StringUtils.substringAfterLast("ajp_djp_gjp_j", "")  = ""
   	 * StringUtils.substringAfterLast("ajp_djp_gjp_j", null)  = ""
   	 * StringUtils.substringAfterLast("ajp_djp_gjp_j", "jk_")  = ""
   	 * StringUtils.substringAfterLast("ajp_djp_gjp_j", "jp_")  = "j"
   	 * </pre>
   	 * @param str  被截取的字符串
   	 * @param separator  截取分隔符
   	 * @return
   	 */
    public static String substringAfterLast(String str, String separator) {
      if (isEmpty(str)) {
        return str;
      }
      if (isEmpty(separator)) {
        return "";
      }
      int pos = str.lastIndexOf(separator);
      if ((pos == -1) || (pos == str.length() - separator.length())) {
        return "";
      }
      return str.substring(pos + separator.length());
    }
    
//    /**
//	 * 字符串分割成Map并放入传入的map内
//	 * 	StringUtils.splitToMap("_","|","1_1_11|2_2_22") = Map{1=Map{1=11}, 2=Map{2=22}}
//	 * @param separator  key,value的分割
//	 * @param separator1 Map,Map的分割
//	 * @param data
//	 * @param map
//	 * @param toneUp 提升增益百分比
//	 * @return
//	 */
//	public static Map<Integer, Map<Integer, Integer>> stringAssemblyMap(String separator, String separator1, String data, Map<Integer, Map<Integer, Integer>> map, int toneUp) {
//		map = (map == null) ? new HashMap<Integer, Map<Integer, Integer>>() : map;
//		
//		if(isBlank(data)) {
//			return map;
//		}
//		
//		String[] dataArr = StringUtils.split(separator1, data);
//		
//		for (String mapStr : dataArr) {
//			String[] strs = StringUtils.split(separator, mapStr);
//			if(strs.length < 3) { //格式不符合的跳过
//				continue;
//			}
//			
//			Integer type = Integer.parseInt(strs[0]);
//			Integer id = Integer.parseInt(strs[1]);
//			int num = Integer.parseInt(strs[2]);
//			
//			if(strs.length == 4) { //发送奖励的时候有多一个概率
//				int random = Integer.parseInt(strs[3]);
//				
//				//计算概率
//				int temp = RandomUtil.getRandomInt(1, 100);
//				if(temp > random){
//					continue;
//				}
//			}
//			
//			if(toneUp > 0 && num > 0){
//				num = NumericUtils.d100_EnhanceCount(num, toneUp);
//			}
//			
//			Map<Integer, Integer> subMap = map.get(type);
//			if(subMap == null ) {
//				subMap = new HashMap<>();
//				map.put(type, subMap);
//			}
//			num = subMap.get(id) == null ? num : num + subMap.get(id);
//			subMap.put(id, num);
//			
//		}
//		
//		return map;
//	}
		
    
    /**
    * 判断是否是Email
    * @return
    */
    public static boolean isEmail(String email) {
		Pattern emailPattern = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
		Matcher matcher = emailPattern.matcher(email);
		if(matcher.find()){
			return true;
		}
		return false;
    }
    
   
	/**
	 * 去掉尾巴
	 * @param a
	 * @return
	 */
	public static String throwTail(String a){
		if(a==null){
			return null;
		}
		if(a.length()<=1){
			return a;
		}
		return a.substring(0,a.length()-1);
	}
    
}
